#!/bin/bash

:<<eof

sed 流编辑器 对标准输出或文件逐行进行处理，如果匹配的上，则进行操作(删除修改)

1. 使用形式
    a. stdout | sed [option] "/pattern/command"
    b. sed [option] "/pattern/command" file

2. sed的选项

-n 只打印模式匹配行
-e 直接在命令行进行sed编辑，默认选项
-f 编辑动作保存在文件中，指定文件执行
-r 支持扩展正则表达式
-i 直接修改文件内容

3. sed的pattern

10command                       匹配到第10行
10,20command                    匹配从第10行开始，到第20行结束
10,+5command                    匹配从第10行开始，到第16行结束
/pattern1/command               匹配到pattern1的行（常用）
/pattern1/,/pattern2/command    匹配到pattern1的行开始，到匹配到pattern2的行结束（常用）
10,/pattern1/command            匹配从10行开始，到匹配到pattern1的行结束
/pattern1/,10command            匹配从pattern1行开始，到匹配到10的行结束（常用）

4. sed command

查询

p 打印

增加

a   行后追加
i   行前追加
r   外部文件读入，行后追加
w   匹配行写入外部文件

删除
d   删除

修改

s/old/new       将行内第一个old替换为new
s/old/new/g     将行内全部的ld替换为new（常用）
s/old/new/2g    将行内前2个old替换为new
s/old/new/ig    将行内old全部替换为new，忽略大小写

显示行号

/pattern/=      显示行号


5. 反向引用

sed -i 's/pattern/&s/g' file

&   表示行中匹配的内容
\1  表示行中匹配的内容，但是pattern需要使用小括号括起来


案例

sed -r 's/:/&?/g' passwd
sed -r 's/\(:\)/\1?/g' passwd


passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:102:105::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:103:106:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
syslog:x:104:111::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
uuidd:x:106:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:107:113::/nonexistent:/usr/sbin/nologin
fanlihao:x:1000:1000:,,,:/home/fanlihao:/bin/bash
fanlihao:x:1000:1000:,,,:/home/fanlihao:/bin/bash
sshd:x:108:65534::/run/sshd:/usr/sbin/nologin

passwd.sed
/fanlihao/p
/root/p
eof


# 命令出错会停止执行
set -e
# 打印每条执行的命令
set -x
# -e 指定多个匹配项
sed -n -e '/fanlihao/p' -e '/root/p' passwd
# -f 指定文件，其中包含每条sed的 "/pattern/command"
sed -n -f passwd.sed passwd
# -r 开启扩展正则表达式
sed -n -r '/fanlihao|root/p'  passwd



sed -rn '/^_[a-zA-Z]+/p' passwd
# _apt:x:105:65534::/nonexistent:/usr/sbin/nologin
# 给每个: 后面添加一个?
sed -r 's/:/&?/g' passwd



set +x
